#include <stdio.h>
#define BS 1024 /* Device block Size */
#define roundup(val, rnd) (((val + rnd - 1) / rnd) * rnd)
main(int argc, char *argv[])
{
int i, length, lvs, pvs, pxs;
if (argc != 4) {
/* Usage example:
* Maximum LVs in the VG = 255,
* Maximum PVs in the VG = 16
* Maximum extents per PV = 2500 :
*
* $ esize 255 16 2500
*/
printf("USAGE: %s <MAXLVs> <MAXPVs> <MAXPXs>\n", argv[0]);
exit(1);
}
lvs = atoi(argv[1]); pvs = atoi(argv[2]); pxs = atoi(argv[3]);
length = 16 + 2 * roundup(2 +
         (roundup(36 + ((3 * roundup(pvs, 32)) / 8) +
         (roundup(pxs, 8) / 8) * pvs, BS) +
         roundup(16 * lvs, BS) +
         roundup(16 + 4 * pxs, BS) * pvs) / BS, 8);
if (length > 768) {
    printf("Warning: A bootable PV cannot be added to a VG \n"
    "created with the specified argument values. \n"
    "The metadata size %d Kbytes, must be less \n"
    "than 768 Kbytes.\n"
    "If the intention is not to have a boot disk in this \n"
    "VG then do not use '-B' option during pvcreate(1M) \n"
    "for the PVs to be part of this VG. \n", length);
}

printf("Metadata size is %dK bytes\n", length);


length = roundup(length, 1024) / 1024;
if (length > 256 ) {
    printf("Cannot configure a VG with this maximum values"
            " for LVs, PVs and PXs\n");
    exit(1);
}
for (i = 1; i < length ; i = i << 1) { }
printf("\nMinimum extent size for this configuration = %d MB\n", i);
}